package com.xiaoleilu.hutool.util;

import java.awt.Color;
import java.nio.charset.Charset;

/**
 * 十六进制（简写为hex或下标16）在数学中是一种逢16进1的进位制，一般用数字0到9和字母A到F表示（其中:A~F即10~15）。<br>
 * 例如十进制数57，在二进制写作111001，在16进制写作39。<br>
 * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20<br>
 *
 * 参考：https://my.oschina.net/xinxingegeya/blog/287476
 *
 * @author Looly
 */
public class HexUtil {

    /**
     * 判断给定字符串是否为16进制数<br>
     * 如果是，需要使用对应数字类型对象的<code>decode</code>方法解码<br>
     * 例如：{@code Integer.decode}方法解码int类型的16进制数字
     *
     * @param value 值
     * @return 是否为16进制
     */
    public static boolean isHexNumber(String value) {
        return org.dromara.hutool.core.codec.binary.HexUtil.isHexNumber(value);
    }

    // ---------------------------------------------------------------------------------------------------- encode
    /**
     * 将字节数组转换为十六进制字符数组
     *
     * @param data byte[]
     * @return 十六进制char[]
     */
    public static char[] encodeHex(byte[] data) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encode(data);
    }

    /**
     * 将字节数组转换为十六进制字符数组
     *
     * @param str 字符串
     * @param charset 编码
     * @return 十六进制char[]
     */
    public static char[] encodeHex(String str, Charset charset) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encode(str, charset);
    }

    /**
     * 将字节数组转换为十六进制字符数组
     *
     * @param data byte[]
     * @param toLowerCase <code>true</code> 传换成小写格式 ， <code>false</code> 传换成大写格式
     * @return 十六进制char[]
     */
    public static char[] encodeHex(byte[] data, boolean toLowerCase) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encode(data, toLowerCase);
    }

    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param data byte[]
     * @return 十六进制String
     */
    public static String encodeHexStr(byte[] data) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeStr(data);
    }

    /**
     * 将字节数组转换为十六进制字符串，结果为小写
     *
     * @param data 被编码的字符串
     * @param charset 编码
     * @return 十六进制String
     */
    public static String encodeHexStr(String data, Charset charset) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeStr(data, charset);
    }

    /**
     * 将字节数组转换为十六进制字符串，结果为小写，默认编码是UTF-8
     *
     * @param data 被编码的字符串
     * @return 十六进制String
     */
    public static String encodeHexStr(String data) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeStr(data);
    }

    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param data byte[]
     * @param toLowerCase <code>true</code> 传换成小写格式 ， <code>false</code> 传换成大写格式
     * @return 十六进制String
     */
    public static String encodeHexStr(byte[] data, boolean toLowerCase) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeStr(data, toLowerCase);
    }

    // ---------------------------------------------------------------------------------------------------- decode
    /**
     * 将十六进制字符数组转换为字符串，默认编码UTF-8
     *
     * @param hexStr 十六进制String
     * @return 字符串
     */
    public static String decodeHexStr(String hexStr) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decodeStr(hexStr);
    }

    /**
     * 将十六进制字符数组转换为字符串
     *
     * @param hexStr 十六进制String
     * @param charset 编码
     * @return 字符串
     */
    public static String decodeHexStr(String hexStr, Charset charset) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decodeStr(hexStr, charset);
    }

    /**
     * 将十六进制字符数组转换为字符串
     *
     * @param hexData 十六进制char[]
     * @param charset 编码
     * @return 字符串
     */
    public static String decodeHexStr(char[] hexData, Charset charset) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decodeStr(hexData, charset);
    }

    /**
     * 将十六进制字符数组转换为字节数组
     *
     * @param hexData 十六进制char[]
     * @return byte[]
     * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度，将抛出运行时异常
     */
    public static byte[] decodeHex(char[] hexData) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decode(hexData);
    }

    /**
     * 将十六进制字符串解码为byte[]
     *
     * @param hexStr 十六进制String
     * @return byte[]
     */
    public static byte[] decodeHex(String hexStr) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decode(hexStr);
    }

    // ---------------------------------------------------------------------------------------- Color
    /**
     * 将{@link Color}编码为Hex形式
     * @param color {@link Color}
     * @return Hex字符串
     * @since 3.0.8
     */
    public static String encodeColor(Color color) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeColor(color);
    }

    /**
     * 将{@link Color}编码为Hex形式
     * @param color {@link Color}
     * @param prefix 前缀字符串，可以是#、0x等
     * @return Hex字符串
     * @since 3.0.8
     */
    public static String encodeColor(Color color, String prefix) {
        return org.dromara.hutool.core.codec.binary.HexUtil.encodeColor(color, prefix);
    }

    /**
     * 将Hex颜色值转为
     * @param hexColor 16进制颜色值，可以以#开头，也可以用0x开头
     * @return {@link Color}
     * @since 3.0.8
     */
    public static Color decodeColor(String hexColor) {
        return org.dromara.hutool.core.codec.binary.HexUtil.decodeColor(hexColor);
    }

    /**
     * 将指定int值转换为Unicode字符串形式，常用于特殊字符（例如汉字）转Unicode形式<br>
     * 转换的字符串如果u后不足4位，则前面用0填充，例如：
     * <pre>
     * '我' =》\u4f60
     * </pre>
     *
     * @param value int值，也可以是char
     * @return Unicode表现形式
     */
    public static String toUnicodeHex(int value) {
        return org.dromara.hutool.core.codec.binary.HexUtil.toUnicodeHex(value);
    }

}